#include <stdio.h>
#include <sys/stat.h>
#include <errno.h>

#if 0

用于检索文件或目录信息.
它与stat()函数相似，但可以处理文件大于2GB的情况。

stat64()函数可以获取文件或目录的各种属性信息，如文件或目录的大小、权限、创建时间、修改时间等。
它还可以检查文件或目录是否存在，权限是否足够等等。
在需要获取文件或目录信息时，stat64()函数是一种非常实用的工具。

int __xstat(int ver, const char *path, (struct stat *stat_buf))

ver  32bit or 64bit 此值不一样
path 参数为要查询的文件或目录路径；
buf  为返回的文件或目录信息结构体；
函数返回值为0表示成功，-1表示失败，并设置errno全局变量表示错误类型。

#ifndef __x86_64__
# define _STAT_VER_LINUX    3
#else
# define _STAT_VER_LINUX    1
#endif

64位参数ver应该设置为1，而在32位编译上设置为3。

struct stat {
        unsigned long  st_dev;				/* 文件所在设备的ID */
        unsigned long  st_ino;				/* 节点号 */
        unsigned short st_mode;				/* 文件对应的模式，文件，目录等 */
        unsigned short st_nlink;			/* 链向此文件的连接数(硬连接) */
        unsigned short st_uid;
        unsigned short st_gid;
        unsigned long  st_rdev;				/* 设备号，针对设备文件 */
        unsigned long  st_size;				/* 文件大小，字节为单位 */
        unsigned long  st_blksize;			/* 系统块的大小 */
        unsigned long  st_blocks;			/* 文件所占块数 */
        unsigned long  st_atime;			/* 文件数据的最后访问时间 */
        unsigned long  st_atime_nsec;
        unsigned long  st_mtime;			/* 文件数据的最后修改时间 */
        unsigned long  st_mtime_nsec;
        unsigned long  st_ctime;			/* i节点状态的最后更改时间 */
        unsigned long  st_ctime_nsec;
        unsigned long  __unused4;
        unsigned long  __unused5;
};

#endif


void debug_file_stat(struct stat * fs)
{
	printf("dev: \t\t\t\t%ld\n", fs->st_dev);
    printf("inode: \t\t\t\t%ld\n", fs->st_ino);
    printf("protection: \t\t\t%o\n", fs->st_mode);
    printf("number of hard links: \t\t%lu\n", fs->st_nlink);
    printf("user ID of owner: \t\t%d\n", fs->st_uid);
    printf("group ID of owner: \t\t%d\n", fs->st_gid);
    printf("file size in bytes: \t\t%ld\n", fs->st_size);
	printf("block size is: \t\t\t%ld\n",fs->st_blksize);			/* 文件占用的块数量 */
	printf("number of allocated blocks is: \t%ld\n",fs->st_blocks);	/* 文件分配块数量 */
}   

int main()
{
    struct stat pstat_buf;
    int stat64 = __xstat64(_STAT_VER_LINUX, "/proc/1", &pstat_buf);
    printf("%d %d\n", stat64, errno);	/* 0 0 */

	debug_file_stat(&pstat_buf);

    printf("sizeof(st_dev)=%d\n", sizeof(pstat_buf.st_dev));        // 8   
    printf("sizeof(st_ino)=%d\n", sizeof(pstat_buf.st_ino));        // 8
    printf("sizeof(st_mode)=%d\n", sizeof(pstat_buf.st_mode));      // 4
    printf("sizeof(st_nlink)=%d\n", sizeof(pstat_buf.st_nlink));    // 8
    printf("sizeof(st_uid)=%d\n", sizeof(pstat_buf.st_uid));        // 4

	return 0;
}

#if 0
dev:                            5
inode:                          2081
protection:                     40555
number of hard links:           9
user ID of owner:               0
group ID of owner:              0
file size in bytes:             0
block size is:                  1024
number of allocated blocks is:  0
#endif
